home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / FROMUTS / UNIXLIB37B / src / c / getpw < prev    next >
Text File  |  1992-02-26  |  4KB  |  222 lines

  1. #ifdef __STDC__
  2. static char sccs_id[] = "@(#) getpw.c 2.1 "__DATE__" HJR";
  3. #else
  4. static char sccs_id[] = "@(#) getpw.c 2.1 11/08/90 HJR";
  5. #endif
  6.  
  7. /* getpw.c (c) Copyright 1990 H.Rogers */
  8.  
  9. /* #define P_TEST */    /* test main() */
  10.  
  11. #include <stdio.h>
  12. #include <string.h>
  13.  
  14. #ifdef __STDC__
  15. #include <stdlib.h>
  16. #else
  17. extern int exit();
  18. extern int atoi();
  19. #endif
  20.  
  21. #include "pwd.h"
  22.  
  23. #ifdef __STDC__
  24. static void p_pdecode(char *,struct passwd *);
  25. static char *p_pstrcp(char **);
  26. #else
  27. static void p_pdecode();
  28. static char *p_pstrcp();
  29. #endif
  30.  
  31. #define PBUFSIZ 256    /* max. length of a line in /etc/passwd */
  32.  
  33. static char *p_buf = 0;
  34. static FILE *p_pwfile = 0;
  35. static struct passwd p_rval[1];
  36. static char *pwfile = "/etc/passwd";
  37.  
  38. /* getpwent() */
  39.  
  40. #ifdef __STDC__
  41. struct passwd *getpwent(void)
  42. #else
  43. struct passwd *getpwent()
  44. #endif
  45. {
  46. if (!p_pwfile)
  47.   if (setpwfile(pwfile) < 0) return(0);
  48. return(fgetpwent(p_pwfile));
  49. }
  50.  
  51. /* fgetpwent() */
  52.  
  53. #ifdef __STDC__
  54. struct passwd *fgetpwent(register FILE *pfile)
  55. #else
  56. struct passwd *fgetpwent(pfile)
  57. register FILE *pfile;
  58. #endif
  59. {
  60. register char *bp;
  61.  
  62. if (!pfile) return(0);
  63.  
  64. if (!p_buf) if (!(p_buf = malloc(PBUFSIZ))) return(0);
  65. if (!fgets(p_buf,1024,pfile)) return(0);
  66. bp = p_buf;
  67. while (*bp) bp++;
  68. if (*--bp != '\n') return(0);
  69. *bp = 0;
  70. p_pdecode(p_buf,p_rval);
  71. return(p_rval);
  72. }
  73.  
  74. /* getpwuid() */
  75.  
  76. #ifdef __STDC__
  77. struct passwd *getpwuid(register int uid)
  78. #else
  79. struct passwd *getpwuid(uid)
  80. register int uid;
  81. #endif
  82. {
  83. if (setpwent() < 0) return(0);
  84. while (fgetpwent(p_pwfile)) if (p_rval->pw_uid == uid) return(p_rval);
  85. return(0);
  86. }
  87.  
  88. /* getpwnam() */
  89.  
  90. #ifdef __STDC__
  91. struct passwd *getpwnam(register char *name)
  92. #else
  93. struct passwd *getpwnam(name)
  94. register char *name;
  95. #endif
  96. {
  97. if (!(name ? *name : 0)) return(0);
  98. if (setpwent() < 0) return(0);
  99. while (fgetpwent(p_pwfile))
  100.   if (!strcmp(p_rval->pw_name,name) && p_rval->pw_name)
  101.     return(p_rval);
  102. return(0);
  103. }
  104.  
  105. /* setpwent() */
  106.  
  107. #ifdef __STDC__
  108. int setpwent(void)
  109. #else
  110. int setpwent()
  111. #endif
  112. {
  113. if (!p_pwfile)
  114.   if (setpwfile(pwfile) < 0) return(-1);
  115. return(fseek(p_pwfile,0L,0) ? -1 : 0);
  116. }
  117.  
  118. /* endpwent() */
  119.  
  120. #ifdef __STDC__
  121. int endpwent(void)
  122. #else
  123. int endpwent()
  124. #endif
  125. {
  126. if (!p_pwfile) return(-1); /* 0 ? */
  127. if (fclose(p_pwfile)) return(-1);
  128. p_pwfile = 0; return(0);
  129. }
  130.  
  131. /* setpwfile() */
  132.  
  133. #ifdef __STDC__
  134. int setpwfile(char *name)
  135. #else
  136. int setpwfile(name)
  137. char *name;
  138. #endif
  139. {
  140. if (!(name ? *name : 0)) return(-1); /* 0 ? */
  141. if (p_pwfile) { fclose(p_pwfile); p_pwfile = 0; }
  142. return((p_pwfile = fopen(name,"r")) ? 0 : -1);
  143. }
  144.  
  145. /* p_pdecode() */
  146.  
  147. #ifdef __STDC__
  148. static void p_pdecode(register char *line,register struct passwd *passwd)
  149. #else
  150. static void p_pdecode(line,passwd)
  151. register char *line;
  152. register struct passwd *passwd;
  153. #endif
  154. {
  155. char *lp;
  156.  
  157. if ((!line) || (!passwd)) return;
  158.  
  159. lp = line;
  160.  
  161. passwd->pw_name = p_pstrcp(&lp);
  162. passwd->pw_passwd = p_pstrcp(&lp);
  163. passwd->pw_uid = atoi(p_pstrcp(&lp));
  164. passwd->pw_gid = atoi(p_pstrcp(&lp));
  165. passwd->pw_quota = 0;
  166. passwd->pw_comment = 0;
  167. passwd->pw_gecos = p_pstrcp(&lp);
  168. passwd->pw_dir = p_pstrcp(&lp);
  169. passwd->pw_shell = p_pstrcp(&lp);
  170. }
  171.  
  172. /* p_pstrcp() */
  173.  
  174. #ifdef __STDC__
  175. static char *p_pstrcp(register char **lp)
  176. #else
  177. static char *p_pstrcp(lp)
  178. register char **lp;
  179. #endif
  180. {
  181. register char *l = *lp,*r = l;
  182.  
  183. while ((*l != ':') && *l) l++; if (*l) *l++ = 0; *lp = l; return(r);
  184. }
  185.  
  186. #ifdef P_TEST
  187.  
  188. /* main() */
  189.  
  190. #ifdef __STDC__
  191. int main(int argc,char **argv)
  192. #else
  193. int main(argc,argv)
  194. int argc;
  195. char **argv;
  196. #endif
  197. {
  198. struct passwd *p;
  199.  
  200. if (argc != 2)
  201.   {
  202.   fprintf(stderr,"usage: getpw user\n");
  203.   exit(1);
  204.   }
  205.  
  206. if (!(p = getpwnam(argv[1])))
  207.   {
  208.   printf("getpw: %s not found\n",argv[1]);
  209.   exit(1);
  210.   }
  211.  
  212. printf("name:\t%s\n",p->pw_name);
  213. printf("passwd:\t%s\n",p->pw_passwd);
  214. printf("uid:\t%d\n",p->pw_uid);
  215. printf("gid:\t%d\n",p->pw_gid);
  216. printf("gecos:\t%s\n",p->pw_gecos);
  217. printf("dir:\t%s\n",p->pw_dir);
  218. printf("shell:\t%s\n",p->pw_shell);
  219. }
  220.  
  221. #endif /* P_TEST */
  222.